home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / uuid.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  14KB  |  477 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __author__ = 'Ka-Ping Yee <ping@zesty.ca>'
  5. (RESERVED_NCS, RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE) = [
  6.     'reserved for NCS compatibility',
  7.     'specified in RFC 4122',
  8.     'reserved for Microsoft compatibility',
  9.     'reserved for future definition']
  10.  
  11. class UUID(object):
  12.     
  13.     def __init__(self, hex = None, bytes = None, bytes_le = None, fields = None, int = None, version = None):
  14.         if [
  15.             hex,
  16.             bytes,
  17.             bytes_le,
  18.             fields,
  19.             int].count(None) != 4:
  20.             raise TypeError('need one of hex, bytes, bytes_le, fields, or int')
  21.         
  22.         if hex is not None:
  23.             hex = hex.replace('urn:', '').replace('uuid:', '')
  24.             hex = hex.strip('{}').replace('-', '')
  25.             if len(hex) != 32:
  26.                 raise ValueError('badly formed hexadecimal UUID string')
  27.             
  28.             int = long(hex, 16)
  29.         
  30.         if bytes_le is not None:
  31.             if len(bytes_le) != 16:
  32.                 raise ValueError('bytes_le is not a 16-char string')
  33.             
  34.             bytes = bytes_le[3] + bytes_le[2] + bytes_le[1] + bytes_le[0] + bytes_le[5] + bytes_le[4] + bytes_le[7] + bytes_le[6] + bytes_le[8:]
  35.         
  36.         if bytes is not None:
  37.             if len(bytes) != 16:
  38.                 raise ValueError('bytes is not a 16-char string')
  39.             
  40.             int = long('%02x' * 16 % tuple(map(ord, bytes)), 16)
  41.         
  42.         if fields is not None:
  43.             if len(fields) != 6:
  44.                 raise ValueError('fields is not a 6-tuple')
  45.             
  46.             (time_low, time_mid, time_hi_version, clock_seq_hi_variant, clock_seq_low, node) = fields
  47.             if time_low <= time_low:
  48.                 pass
  49.             elif not time_low < 0x100000000L:
  50.                 raise ValueError('field 1 out of range (need a 32-bit value)')
  51.             
  52.             if time_mid <= time_mid:
  53.                 pass
  54.             elif not time_mid < 0x10000L:
  55.                 raise ValueError('field 2 out of range (need a 16-bit value)')
  56.             
  57.             if time_hi_version <= time_hi_version:
  58.                 pass
  59.             elif not time_hi_version < 0x10000L:
  60.                 raise ValueError('field 3 out of range (need a 16-bit value)')
  61.             
  62.             if clock_seq_hi_variant <= clock_seq_hi_variant:
  63.                 pass
  64.             elif not clock_seq_hi_variant < 0x100L:
  65.                 raise ValueError('field 4 out of range (need an 8-bit value)')
  66.             
  67.             if clock_seq_low <= clock_seq_low:
  68.                 pass
  69.             elif not clock_seq_low < 0x100L:
  70.                 raise ValueError('field 5 out of range (need an 8-bit value)')
  71.             
  72.             if node <= node:
  73.                 pass
  74.             elif not node < 0x1000000000000L:
  75.                 raise ValueError('field 6 out of range (need a 48-bit value)')
  76.             
  77.             clock_seq = clock_seq_hi_variant << 0x8L | clock_seq_low
  78.             int = time_low << 0x60L | time_mid << 0x50L | time_hi_version << 0x40L | clock_seq << 0x30L | node
  79.         
  80.         if int is not None:
  81.             if int <= int:
  82.                 pass
  83.             elif not int < 0x100000000000000000000000000000000L:
  84.                 raise ValueError('int is out of range (need a 128-bit value)')
  85.             
  86.         
  87.         if version is not None:
  88.             if version <= version:
  89.                 pass
  90.             elif not version <= 5:
  91.                 raise ValueError('illegal version number')
  92.             
  93.             int &= -0xC000000000000001L
  94.             int |= 0x8000000000000000L
  95.             int &= -0xF0000000000000000001L
  96.             int |= version << 0x4CL
  97.         
  98.         self.__dict__['int'] = int
  99.  
  100.     
  101.     def __cmp__(self, other):
  102.         if isinstance(other, UUID):
  103.             return cmp(self.int, other.int)
  104.         
  105.         return NotImplemented
  106.  
  107.     
  108.     def __hash__(self):
  109.         return hash(self.int)
  110.  
  111.     
  112.     def __int__(self):
  113.         return self.int
  114.  
  115.     
  116.     def __repr__(self):
  117.         return 'UUID(%r)' % str(self)
  118.  
  119.     
  120.     def __setattr__(self, name, value):
  121.         raise TypeError('UUID objects are immutable')
  122.  
  123.     
  124.     def __str__(self):
  125.         hex = '%032x' % self.int
  126.         return '%s-%s-%s-%s-%s' % (hex[:8], hex[8:12], hex[12:16], hex[16:20], hex[20:])
  127.  
  128.     
  129.     def get_bytes(self):
  130.         bytes = ''
  131.         for shift in range(0, 128, 8):
  132.             bytes = chr(self.int >> shift & 255) + bytes
  133.         
  134.         return bytes
  135.  
  136.     bytes = property(get_bytes)
  137.     
  138.     def get_bytes_le(self):
  139.         bytes = self.bytes
  140.         return bytes[3] + bytes[2] + bytes[1] + bytes[0] + bytes[5] + bytes[4] + bytes[7] + bytes[6] + bytes[8:]
  141.  
  142.     bytes_le = property(get_bytes_le)
  143.     
  144.     def get_fields(self):
  145.         return (self.time_low, self.time_mid, self.time_hi_version, self.clock_seq_hi_variant, self.clock_seq_low, self.node)
  146.  
  147.     fields = property(get_fields)
  148.     
  149.     def get_time_low(self):
  150.         return self.int >> 0x60L
  151.  
  152.     time_low = property(get_time_low)
  153.     
  154.     def get_time_mid(self):
  155.         return self.int >> 0x50L & 65535
  156.  
  157.     time_mid = property(get_time_mid)
  158.     
  159.     def get_time_hi_version(self):
  160.         return self.int >> 0x40L & 65535
  161.  
  162.     time_hi_version = property(get_time_hi_version)
  163.     
  164.     def get_clock_seq_hi_variant(self):
  165.         return self.int >> 0x38L & 255
  166.  
  167.     clock_seq_hi_variant = property(get_clock_seq_hi_variant)
  168.     
  169.     def get_clock_seq_low(self):
  170.         return self.int >> 0x30L & 255
  171.  
  172.     clock_seq_low = property(get_clock_seq_low)
  173.     
  174.     def get_time(self):
  175.         return (self.time_hi_version & 0xFFFL) << 0x30L | self.time_mid << 0x20L | self.time_low
  176.  
  177.     time = property(get_time)
  178.     
  179.     def get_clock_seq(self):
  180.         return (self.clock_seq_hi_variant & 0x3FL) << 0x8L | self.clock_seq_low
  181.  
  182.     clock_seq = property(get_clock_seq)
  183.     
  184.     def get_node(self):
  185.         return self.int & 0xFFFFFFFFFFFFL
  186.  
  187.     node = property(get_node)
  188.     
  189.     def get_hex(self):
  190.         return '%032x' % self.int
  191.  
  192.     hex = property(get_hex)
  193.     
  194.     def get_urn(self):
  195.         return 'urn:uuid:' + str(self)
  196.  
  197.     urn = property(get_urn)
  198.     
  199.     def get_variant(self):
  200.         if not self.int & 0x8000000000000000L:
  201.             return RESERVED_NCS
  202.         elif not self.int & 0x4000000000000000L:
  203.             return RFC_4122
  204.         elif not self.int & 0x2000000000000000L:
  205.             return RESERVED_MICROSOFT
  206.         else:
  207.             return RESERVED_FUTURE
  208.  
  209.     variant = property(get_variant)
  210.     
  211.     def get_version(self):
  212.         if self.variant == RFC_4122:
  213.             return int(self.int >> 0x4CL & 15)
  214.         
  215.  
  216.     version = property(get_version)
  217.  
  218.  
  219. def _find_mac(command, args, hw_identifiers, get_index):
  220.     import os as os
  221.     for dir in [
  222.         '',
  223.         '/sbin/',
  224.         '/usr/sbin']:
  225.         executable = os.path.join(dir, command)
  226.         if not os.path.exists(executable):
  227.             continue
  228.         
  229.         
  230.         try:
  231.             cmd = 'LC_ALL=C %s %s 2>/dev/null' % (executable, args)
  232.             pipe = os.popen(cmd)
  233.         except IOError:
  234.             continue
  235.  
  236.         for line in pipe:
  237.             words = line.lower().split()
  238.             for i in range(len(words)):
  239.                 if words[i] in hw_identifiers:
  240.                     return int(words[get_index(i)].replace(':', ''), 16)
  241.                     continue
  242.             
  243.         
  244.     
  245.  
  246.  
  247. def _ifconfig_getnode():
  248.     for args in ('', '-a', '-av'):
  249.         mac = _find_mac('ifconfig', args, [
  250.             'hwaddr',
  251.             'ether'], (lambda i: i + 1))
  252.         if mac:
  253.             return mac
  254.             continue
  255.     
  256.     import socket as socket
  257.     ip_addr = socket.gethostbyname(socket.gethostname())
  258.     mac = _find_mac('arp', '-an', [
  259.         ip_addr], (lambda i: -1))
  260.     if mac:
  261.         return mac
  262.     
  263.     mac = _find_mac('lanscan', '-ai', [
  264.         'lan0'], (lambda i: 0))
  265.     if mac:
  266.         return mac
  267.     
  268.  
  269.  
  270. def _ipconfig_getnode():
  271.     import os
  272.     import re as re
  273.     dirs = [
  274.         '',
  275.         'c:\\windows\\system32',
  276.         'c:\\winnt\\system32']
  277.     
  278.     try:
  279.         import ctypes as ctypes
  280.         buffer = ctypes.create_string_buffer(300)
  281.         ctypes.windll.kernel32.GetSystemDirectoryA(buffer, 300)
  282.         dirs.insert(0, buffer.value.decode('mbcs'))
  283.     except:
  284.         pass
  285.  
  286.     for dir in dirs:
  287.         
  288.         try:
  289.             pipe = os.popen(os.path.join(dir, 'ipconfig') + ' /all')
  290.         except IOError:
  291.             continue
  292.  
  293.         for line in pipe:
  294.             value = line.split(':')[-1].strip().lower()
  295.             if re.match('([0-9a-f][0-9a-f]-){5}[0-9a-f][0-9a-f]', value):
  296.                 return int(value.replace('-', ''), 16)
  297.                 continue
  298.         
  299.     
  300.  
  301.  
  302. def _netbios_getnode():
  303.     import win32wnet as win32wnet
  304.     import netbios as netbios
  305.     ncb = netbios.NCB()
  306.     ncb.Command = netbios.NCBENUM
  307.     ncb.Buffer = adapters = netbios.LANA_ENUM()
  308.     adapters._pack()
  309.     if win32wnet.Netbios(ncb) != 0:
  310.         return None
  311.     
  312.     adapters._unpack()
  313.     for i in range(adapters.length):
  314.         ncb.Reset()
  315.         ncb.Command = netbios.NCBRESET
  316.         ncb.Lana_num = ord(adapters.lana[i])
  317.         if win32wnet.Netbios(ncb) != 0:
  318.             continue
  319.         
  320.         ncb.Reset()
  321.         ncb.Command = netbios.NCBASTAT
  322.         ncb.Lana_num = ord(adapters.lana[i])
  323.         ncb.Callname = '*'.ljust(16)
  324.         ncb.Buffer = status = netbios.ADAPTER_STATUS()
  325.         if win32wnet.Netbios(ncb) != 0:
  326.             continue
  327.         
  328.         status._unpack()
  329.         bytes = map(ord, status.adapter_address)
  330.         return (bytes[0] << 0x28L) + (bytes[1] << 0x20L) + (bytes[2] << 0x18L) + (bytes[3] << 0x10L) + (bytes[4] << 0x8L) + bytes[5]
  331.     
  332.  
  333. _uuid_generate_random = None
  334. _uuid_generate_time = None
  335. _UuidCreate = None
  336.  
  337. try:
  338.     import ctypes
  339.     import ctypes.util as ctypes
  340.     _buffer = ctypes.create_string_buffer(16)
  341.     for libname in [
  342.         'uuid',
  343.         'c']:
  344.         
  345.         try:
  346.             lib = ctypes.CDLL(ctypes.util.find_library(libname))
  347.         except:
  348.             continue
  349.  
  350.         if hasattr(lib, 'uuid_generate_random'):
  351.             _uuid_generate_random = lib.uuid_generate_random
  352.         
  353.         if hasattr(lib, 'uuid_generate_time'):
  354.             _uuid_generate_time = lib.uuid_generate_time
  355.             continue
  356.     
  357.     
  358.     try:
  359.         lib = ctypes.windll.rpcrt4
  360.     except:
  361.         lib = None
  362.  
  363.     _UuidCreate = getattr(lib, 'UuidCreateSequential', getattr(lib, 'UuidCreate', None))
  364. except:
  365.     pass
  366.  
  367.  
  368. def _unixdll_getnode():
  369.     _uuid_generate_time(_buffer)
  370.     return UUID(bytes = _buffer.raw).node
  371.  
  372.  
  373. def _windll_getnode():
  374.     if _UuidCreate(_buffer) == 0:
  375.         return UUID(bytes = _buffer.raw).node
  376.     
  377.  
  378.  
  379. def _random_getnode():
  380.     import random as random
  381.     return random.randrange(0, 0x1000000000000L) | 0x10000000000L
  382.  
  383. _node = None
  384.  
  385. def getnode():
  386.     global _node
  387.     if _node is not None:
  388.         return _node
  389.     
  390.     import sys as sys
  391.     if sys.platform == 'win32':
  392.         getters = [
  393.             _windll_getnode,
  394.             _netbios_getnode,
  395.             _ipconfig_getnode]
  396.     else:
  397.         getters = [
  398.             _unixdll_getnode,
  399.             _ifconfig_getnode]
  400.     for getter in getters + [
  401.         _random_getnode]:
  402.         
  403.         try:
  404.             _node = getter()
  405.         except:
  406.             continue
  407.  
  408.         if _node is not None:
  409.             return _node
  410.             continue
  411.     
  412.  
  413. _last_timestamp = None
  414.  
  415. def uuid1(node = None, clock_seq = None):
  416.     global _last_timestamp
  417.     if _uuid_generate_time:
  418.         if clock_seq is clock_seq:
  419.             pass
  420.         elif clock_seq is None:
  421.             _uuid_generate_time(_buffer)
  422.             return UUID(bytes = _buffer.raw)
  423.         
  424.     import time
  425.     nanoseconds = int(time.time() * 1e+09)
  426.     timestamp = int(nanoseconds / 100) + 0x1B21DD213814000L
  427.     if timestamp <= _last_timestamp:
  428.         timestamp = _last_timestamp + 1
  429.     
  430.     _last_timestamp = timestamp
  431.     if clock_seq is None:
  432.         import random
  433.         clock_seq = random.randrange(0x4000L)
  434.     
  435.     time_low = timestamp & 0xFFFFFFFFL
  436.     time_mid = timestamp >> 0x20L & 0xFFFFL
  437.     time_hi_version = timestamp >> 0x30L & 0xFFFL
  438.     clock_seq_low = clock_seq & 0xFFL
  439.     clock_seq_hi_variant = clock_seq >> 0x8L & 0x3FL
  440.     if node is None:
  441.         node = getnode()
  442.     
  443.     return UUID(fields = (time_low, time_mid, time_hi_version, clock_seq_hi_variant, clock_seq_low, node), version = 1)
  444.  
  445.  
  446. def uuid3(namespace, name):
  447.     import md5 as md5
  448.     hash = md5.md5(namespace.bytes + name).digest()
  449.     return UUID(bytes = hash[:16], version = 3)
  450.  
  451.  
  452. def uuid4():
  453.     if _uuid_generate_random:
  454.         _uuid_generate_random(_buffer)
  455.         return UUID(bytes = _buffer.raw)
  456.     
  457.     
  458.     try:
  459.         import os
  460.         return UUID(bytes = os.urandom(16), version = 4)
  461.     except:
  462.         import random
  463.         bytes = [ chr(random.randrange(256)) for i in range(16) ]
  464.         return UUID(bytes = bytes, version = 4)
  465.  
  466.  
  467.  
  468. def uuid5(namespace, name):
  469.     import sha as sha
  470.     hash = sha.sha(namespace.bytes + name).digest()
  471.     return UUID(bytes = hash[:16], version = 5)
  472.  
  473. NAMESPACE_DNS = UUID('6ba7b810-9dad-11d1-80b4-00c04fd430c8')
  474. NAMESPACE_URL = UUID('6ba7b811-9dad-11d1-80b4-00c04fd430c8')
  475. NAMESPACE_OID = UUID('6ba7b812-9dad-11d1-80b4-00c04fd430c8')
  476. NAMESPACE_X500 = UUID('6ba7b814-9dad-11d1-80b4-00c04fd430c8')
  477.